function Permutation(str)
{
    // write code here
    // 定义一个递归函数 用来确定第x位上面的字符
    var n = str.length // 用n记录给定字符串的长度
    var queue = str.split('') // 将字符串转换成数组
    var res = [] // 记录返回的答案
    
    function fix(x){
      // 递归出来的条件是 递归出口
      if(x === n-1){ // 如果已经到达了最后一位
        res.push(queue.join(''))
        return
      }
      // 使用一个set用来记录已经在第x为上固定过的字符 在每次固定一位的时候 记录一下当前的第一位的字符 如果后续交换后也有同样的字符排列到第一位 就把这种情况排除
      var seen = new Set() // 是一个集合里面的元素不能重复
      for(let i = x ; i < n ; i ++){ // 遍历字符串的字符 遍历范围是从x到n-1 即x后面的字符串 后续的每一个都要和这个x为的进行交换 进而求的后面的问题
        // 因为我们要交换 字符串当中的两个字符 修改字符串 会 产生很多的空间 空间占用率增加 需要将其转换成数组
        if(seen.has(queue[i])){ // 如果集合中已经有了这个元素 就调过这一次的交换 处理有重复问题 判断这个树是不是已经有第一位的情况了 如果有 就调过 
          continue
        }
        // 如果当前字符没有出现过的话 需要把它加入到set当中
        seen.add(queue[i]) // 如果没有第一位的情况 就添加到第一位中
        // 否则的话就交换第x位上的字符和第i位的字符 并且固定第x+1位
        var temp = queue[x]
        queue[x] = queue[i]
        queue[i] = temp
        fix(x+1) // 这个问题解决之后 还需要恢复到上一次的时候 让数组回到原来的排列 这样回到上一层 方便进行下一次 循环
        var temp = queue[x]
        queue[x] = queue[i]
        queue[i] = temp
      }
    }
    fix(0)
    return res
}
module.exports = {
    Permutation : Permutation
};